"""
编辑器小部件。
"""
import typing
from ..framework import dispatch, session_received
from ..base import BaseSession, BaseSessionType, BaseSessionParentType
from .base import BaseTextWidget
from ..utils import callback, to_any


@session_received
class WidgetEditor(BaseSession, BaseTextWidget):
    """
    编辑器小部件类。
    """
    name: typing.ClassVar[str] = 'WidgetEditor'

    @classmethod
    async def create(
            cls: typing.Type[BaseSessionType], parent: BaseSessionParentType, *args: typing.Any, **kwargs: typing.Dict
    ) -> BaseSessionType:
        """
        五个参数：
        @width: 宽度；
        @height: 高度；
        @x: 左上角横坐标；
        @y: 左上角纵坐标；
        @text: 编辑器的文字内容（可选，默认为None）
        使用方法：
        editor = await WidgetEditor.create(activity, 200, 50, 0, 0)
        """
        return await super().create(parent, *cls.parse_region_and_text(*args), **kwargs)

    async def on_receive(self, msg):
        """
        组件的事件转发。
        """
        await super().on_receive(msg)

        name, sid, fid, argv = msg.name, msg.session, msg.future, msg.argv
        match name:
            case 'onGetHint':
                dispatch(self.on_get_hint(argv[0], session_id=sid, future_id=fid))
            case 'onIsInputPhone':
                dispatch(self.on_is_input_phone(argv[0], session_id=sid, future_id=fid))
            case 'onIsInputNumber':
                dispatch(self.on_is_input_number(argv[0], session_id=sid, future_id=fid))
            case _:
                dispatch(super().on_widget_action(*argv, name=name, session_id=sid, future_id=fid))

    @callback(str)
    async def on_get_hint(self, hint, session_id=0, future_id=0):
        """
        当获取编辑器的提示标签成功后，此方法被自动调用。
        通常不需要关注此方法的实现。
        """
        if not session_id:
            return
        self.set_action_result(session_id, future_id, hint)

    async def get_hint(self) -> str:
        """
        获取编辑器用于提示的标签。
        调用示例：
        print(await editor.get_hint())
        """
        return await self.send_action_until_return('getHint')

    async def set_hint(self, hint: str):
        """
        给编辑器设置提示标签,如果编辑器没有任何文字则显示这个标签。
        :param hint: 要显示的编辑器的提示文本。
        调用示例：
        await editor.set_hint('请输入账号')
        """
        dispatch(self.send_action('setHint', to_any(hint)))

    @callback(bool)
    async def on_is_input_phone(self, input_phone, session_id=0, future_id=0):
        """
        当获取编辑器的输入手机号模式成功后，此方法被自动调用。
        通常不需要关注此方法的实现。
        """
        if not session_id:
            return
        self.set_action_result(session_id, future_id, input_phone)

    async def is_input_phone(self) -> bool:
        """
        获取编辑器的输入手机号模式。
        调用示例：
        print(await editor.is_input_phone())
        """
        return await self.send_action_until_return('isInputPhone')

    async def set_input_phone(self, input_phone: bool):
        """
        给编辑器设置输入手机号模式。
        :param input_phone: True为输入手机号模式，False取消输入手机号模式。
        调用示例：
        await editor.set_input_phone(True)
        """
        dispatch(self.send_action('setInputPhone', to_any(input_phone)))

    @callback(bool)
    async def on_is_input_number(self, input_number, session_id=0, future_id=0):
        """
        当获取编辑器的输入数字模式成功后，此方法被自动调用。
        通常不需要关注此方法的实现。
        """
        if not session_id:
            return
        self.set_action_result(session_id, future_id, input_number)

    async def is_input_number(self) -> bool:
        """
        获取编辑器的输入数字模式。
        调用示例：
        print(await editor.is_input_number())
        """
        return await self.send_action_until_return('isInputNumber')

    async def set_input_number(self, input_number: bool):
        """
        给编辑器设置输入数字模式。
        :param input_number: True为输入数字模式，False取消输入数字模式。
        调用示例：
        await editor.set_input_number(True)
        """
        dispatch(self.send_action('setInputNumber', to_any(input_number)))
